#pragma once

#include "util.hpp"

namespace ns_log
{

    using namespace ns_util;    
    
    enum Level
    {
        INFO,   // 正常提示
        DEBUG,   
        WARNING, // 警告
        ERROR,  // 出错，（该用户无法继续）
        FATAL   // 致命，（服务器无法继续）
    };

    /**
     * 日志
     * 错误等级
     * 哪一个文件
     * 哪一行
     * 
     * 什么时候出的错误
     * 
     * 最终调用方式：
     * LOG(level) << message：错误信息
    */
    static std::ostream& Log(std::string level, std::string file_name, int line)
    {
        std::string message;

        //添加日志等级
        message += "[";
        message += level;
        message += "]";

        //添加触发错误的文件、行号
        message += "[";
        message += file_name;
        message += ": ";
        message += std::to_string(line);
        message += "]";

        //添加时间戳
        message += "[";
        message += "time: ";
        message += TimeUtil::GetTimeStamp();
        message += "]";

        std::cout << message;

        return std::cout;
    }

    
    /**
     * 为了能在调用的时候，不用再手动传入文件名和行号，使用编译器自带的宏__FILE__ 和 __LINE__
     * 然后定义宏函数
    */

    /*宏参#会被当成字符串
    * __FILE__：文件名，为调用处文件名
    * __LINE__：行号，为调用处行号
    */
    #define LOG(level) Log(#level, __FILE__, __LINE__)

}


// #ifdef 0

// #pragma once

// #include <iostream>
// #include <string>
// #include "util.hpp"

// namespace ns_log
// {
//     using namespace ns_util;

//     // 日志等级
//     enum
//     {
//         INFO, //就是整数
//         DEBUG,
//         WARNING,
//         ERROR,
//         FATAL
//     };

//     inline std::ostream &Log(const std::string &level, const std::string &file_name, int line)
//     {
//         // 添加日志等级
//         std::string message = "[";
//         message += level;
//         message += "]";

//         // 添加报错文件名称
//         message += "[";
//         message += file_name;
//         message += "]";

//         // 添加报错行
//         message += "[";
//         message += std::to_string(line);
//         message += "]";

//         // 日志时间戳
//         message += "[";
//         message += TimeUtil::GetTimeStamp();
//         message += "]";

//         // cout 本质 内部是包含缓冲区的
//         std::cout << message; //不要endl进行刷新

//         return std::cout;
//     }
//     // LOG(INFo) << "message" << "\n";
//     // 开放式日志
//     #define LOG(level) Log(#level, __FILE__, __LINE__)
// }


// #endif